package com.wdzl.model;

import com.wdzl.util.ImageUtil;

import javax.swing.*;
import java.util.*;

/**
 * @Author: zhang
 * @Date：18:10
 * @Description:
 */
public class CardModel {
    private static Random random = new Random();
    private static String cardImageName = "刷子;剪刀;叉子;手套;水桶;火;玉米;球;瓶子;白菜;稻草;胡萝卜;苹果;铃铛;肉腿;青草";
    //******下面几个参数都可用于控制游戏的难易程度 **********
    //塔形区域的塔层数
    public static int floorCountOfTower =6;
    // 使用的卡片类型数
    private static int cardTypeCount = 20;
    // 各个区域的卡牌数量（层高）
    public static int COUNT_LEFT1 = 20;
    public static int COUNT_LEFT2 = 28;
    public static int COUNT_RIGHT1 = 20;
    public static int COUNT_RIGHT2 = 28;

    // 卡槽容量
    public static final int CARD_SLOT_COUNT = 7; //
    // 区域类型
    public final static int  AREA_TYPE_LEFT_1 = 1;
    public final static int  AREA_TYPE_LEFT_2 = 2;
    public final static int  AREA_TYPE_RIGHT_1 = 3;
    public final static int  AREA_TYPE_RIGHT_2 = 4;
    public final static int  AREA_TYPE_CENTER_5 = 5;

    //所有的卡片图片名
    private static String[] allCardNames;
    //用于显示的卡片图（本关卡选用的卡片名）
    private static ImageIcon[] usedCards;

    //存放所有的卡片
    public static LinkedList<Card> allList;

    //中间区域 塔形区域卡片列表 一压四
    public static List<Card> towerList;

    //一压一  左上区域
    public static List<Card> left1List;
    // 左下区域
    public static List<Card> left2List;
    // 右上区域
    public static List<Card> right1List;
    // 右下区域
    public static List<Card> right2List;

    // 存放放入卡槽的卡片
    public static List<Card> selectedList;

    static {
        initData();
        initCardList();
    }

    public static void initData(){
        //取出所有的图片名
        allCardNames = cardImageName.split(";");
        // 转成列表，用于随机打乱处理
        List<String> list = Arrays.asList(allCardNames);
        // 随机打乱所有的名字列表
        Collections.shuffle(list);
        //防止指定的类型数超出现有的类型数
        if(cardTypeCount > allCardNames.length){
            cardTypeCount = allCardNames.length;
        }
        //当前关卡选用的卡片数组
        usedCards = new ImageIcon[cardTypeCount];
        //从所有的卡片中随机出指定张数的卡片
        for (int i = 0; i < usedCards.length; i++) {
            //因为上面已经随机打乱了一次名字，所以这里不用再随机了。防止出现随机出同一个值情况
//            int index = random.nextInt(allCardNames.length);
            // 直接提取前几个图片名即可
            ImageIcon cardImg = ImageUtil.getImageIconByImgs(allCardNames[i]);
            cardImg.setDescription(allCardNames[i]); //用于保存对应的图片名，用于生成卡片时，给卡片命名。用来排序
            usedCards[i] = cardImg;
        }
    }


    /**
     * 初始化所有区域卡片列表
     * 其他所有区域的卡片都从卡片池中随机抽取
     */
    public static void initAllList(int totalCount){
        allList = new LinkedList<>();
        for (int i = 0; i < totalCount/3; i++) {
            int index = random.nextInt(usedCards.length);
            //放入三张相同的卡片 ,避免随机生成的卡片死局
            for (int j = 0; j < 3; j++) {
                Card card = new Card(usedCards[index]);
                //在创建ImageIcon时，保留了名字
                card.setName(usedCards[index].getDescription());
                card.setSize(50,50);
                allList.add(card);
            }
        }
        // 避免三张连续相同，需要再打乱
        Collections.shuffle(allList);
    }

    /**
     *
     */
    public static void initCardList(){

        //1.初始化塔形区域
        //计算卡片数
        int floorsCount = getTowerCardCount(floorCountOfTower);

        //要保证总数是3的倍数
        int total = floorsCount+COUNT_LEFT1+COUNT_LEFT2+COUNT_RIGHT1+COUNT_RIGHT2;
        //防止不是3的倍数
        COUNT_RIGHT2 -= total%3;

        initAllList(total);

        System.out.println("====塔的卡片数："+floorsCount); //5层 55张
        towerList = getCardList(floorsCount,AREA_TYPE_CENTER_5);


        left1List = getCardList(COUNT_LEFT1,AREA_TYPE_LEFT_1);
        left2List = getCardList(COUNT_LEFT2,AREA_TYPE_LEFT_2);
        right1List = getCardList(COUNT_RIGHT1,AREA_TYPE_RIGHT_1);
        right2List = getCardList(COUNT_RIGHT2,AREA_TYPE_RIGHT_2);

        //卡槽
        selectedList = new ArrayList<>();
    }

    /**
     * 根据数量生成卡片列表,并根据指定区域编号进行分区分类
     */
    private static List<Card> getCardList(int count,int areaType){
        List<Card> list = new ArrayList<>(count);
        for (int i = 0; i < count; i++) {
//            System.out.println(allList.size()+"===="+i);
            // 从初始化的卡片池中获取，这里需要弹出
            Card card = allList.pop();
            card.setGray(true);
            card.setAreaType(areaType);
            list.add(card);
        }
        return list;
    }


    /**
     * 计算塔形按层数计算需要的卡片数
     * @return
     */
    public static int getTowerCardCount(int floorCount){
        if(floorCount < 1){
            return 0;
        }

        int sum = 0;
        for (int i = 1; i <= floorCount; i++) {
            sum += (i * i);
        }

        return sum;
    }

    /**
     * 判断是否已经消除所有卡片，通关了
     * @return
     */
    public static boolean isOk(){
        if(towerList.isEmpty() && left1List.isEmpty() && left2List.isEmpty() && right1List.isEmpty() && right2List.isEmpty()){
            return true;
        }
        return false;
    }
}
